
今天直接進入主題!
Example Code 延續 [Day 26] 動手篇 - I have a Line Bot,I have a Koa Webhooks (2)
安裝 Request package ( npm install request request-promise --save )
下述動工的 Code 放進 Webhooks 或自定義的 Webhooks 裡
User 傳得訊息會放在 Webhooks 收到的 Request 裡的 body.events ,內容大致長這裡
{
  "events": [
    {
      "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
      //  User 傳訊息的型態
      "type": "message",
      "timestamp": 1462629479859,
      "source": {
        "type": "user",
        "userId": "U206d25c2ea6bd87c17655609a1c37cb8"
      },
      "message": {
        "id": "325708",
        // 若外層的型態是 message 才會有再細分,詳細一樣可以從上述說明取得
        "type": "text",
        // User 傳過來的訊息內容
        "text": "Hello, world"
      }
    },
    {
      "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
      "type": "follow",
      "timestamp": 1462629479859,
      "source": {
        "type": "user",
        "userId": "U206d25c2ea6bd87c17655609a1c37cb8"
      }
    }
  ]
}
這裡以 message 當範例,想知道更多可以使用的回覆格式看 這裡
// 使用 Request Promise 發送自定義的訊息
const request = require('request-promise');
// Line Bot 的 Channel Token
const lineBotToken = '...';
// 收到 User Request 時要發回給 User 的訊息放這裡
router.post('/webhooks', function *(ctx, next) {
  // User 給 Bot 的訊息是一個 Array
  const userMessages = ctx.request.body.events;
  
  // 準備回覆給 User 的訊息
  let replyMessages = [];
  replyMessages = userMessages.map((currentReplyMessages, userMessage) => {
    // 等下放我們要回給 User 的訊息,一次最多 5 則
    let messages;
    // User 傳來的訊息型態
    if ( userMessage.type === 'message' ) {
      messages = [
        {type: 'text', text: '你成功了!我回你就是了'},
        {type: 'image', originalContentUrl: 'http://i.imgur.com/xjTET8v.jpg', previewImageUrl: 'https://sdl-stickershop.line.naver.jp/stickershop/v1/product/1179553/iphone/main@2x.png'},
      ];
      
    }
    else {
      messages = [{type: 'text', text: '收到囉!'}];
    }
    
    // request 的 options
    let options = {
        method: 'POST',
        uri: 'https://api.line.me/v2/bot/message/reply',
        // 客制化 headers 內容,主要告訴 Line 收到的訊息格式和 Line Bot 的 Token
        headers: {
          'Content-Type': 'application/json',
          'Authorization': `Bearer ${lineBotToken}`,
        },
        body: {
          // 告訴 Line 這個訊息回覆給誰
          replyToken: userMessage.replyToken,
          messages: messages,
        },
        json: true,
      };
    return request(options);
  });
  
  // 訊息處理好就等待所有 Request 發送出去
  yield Promise.all( replyMessages );
  
})
...
若你和我一樣加回覆功能會再去 Line Bot 確認 Webhooks 是否正確的話,如果 Request 收到的 replyToken 是 00000000000000000000000000000000 和 ffffffffffffffffffffffffffffffff 請略過,因為這兩個 replyToken 是 Line Bot Webhooks 送出來的假 Token ,對這兩個 Token 回覆會導致 Webhooks 收到錯誤而顯示錯誤!
Yeah! Line Bot 會回訊息,接下來相信就是大家發揮自己想法的時候!
好酷喔!!
PHP 可以用官方的 SDK ,步驟比 Node.js 簡化許多,妳也可以打造一個自己的 Line Bot
我這裡有一個簡化官方 PHP SDK 用法的小玩具 https://github.com/weichenlin/LineBusType76
我有同事是用telegram寫寶可夢搜尋機器人XD
有空來玩玩~沒想到line也可以這樣完XD
謝謝Ivan大大^^
暫時捨棄 Telegram ,本來它是首選 :p
[Day 17] 動手篇 - 事前規劃 這篇我有說到選 Line Bot 的原因,其他日後在找時間玩玩 XD